package me.zhengjie.modules.hanzi.service;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.zhengjie.modules.hanzi.config.AiServiceProperties;
import me.zhengjie.modules.hanzi.config.AiServiceProperties.AiProviderConfig;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.Map;

/**
 * AI服务管理器
 * 支持多种AI服务提供商和API格式
 */
@Service
@RequiredArgsConstructor
@Slf4j
public class AiServiceManager {

    private final AiServiceProperties aiServiceProperties;
    private final AiHttpClient aiHttpClient;

    /**
     * 使用AI进行汉字评分
     * @param targetChar 目标汉字
     * @param userImage 用户手写图片
     * @return 评分结果
     */
    public Map<String, Object> scoreWithAI(String targetChar, MultipartFile userImage) {
        // 这个方法保持现有逻辑，由具体的HanziAiScoreService实现处理
        throw new UnsupportedOperationException("This method should be handled by specific HanziAiScoreService implementations");
    }

    /**
     * 调用AI服务（支持图片）
     * @param prompt 提示词
     * @param userImage 用户图片
     * @return AI响应字符串
     */
    public String callAiService(String prompt, MultipartFile userImage) {
        return callAiServiceWithFallback(prompt, userImage);
    }

    /**
     * 调用AI服务（纯文本）
     * @param prompt 提示词
     * @return AI响应字符串
     */
    public String callAiService(String prompt) {
        return callAiServiceWithFallback(prompt, null);
    }

    /**
     * 按优先级调用AI服务，支持失败回退
     * @param prompt 提示词
     * @param userImage 用户图片（可选）
     * @return AI响应字符串
     */
    private String callAiServiceWithFallback(String prompt, MultipartFile userImage) {
        // 按配置的优先级顺序尝试各个服务
        for (String provider : aiServiceProperties.getProviders()) {
            try {
                AiProviderConfig config = aiServiceProperties.getProviderConfig(provider);
                
                // 检查服务是否启用
                if (!config.isEnabled()) {
                    log.debug("AI服务提供商 {} 未启用，跳过", provider);
                    continue;
                }
                
                log.info("尝试使用AI服务提供商: {} (类型: {})", provider, config.getApiType());
                
                // 检查是否支持图片输入
                MultipartFile imageToSend = null;
                if (userImage != null && config.isUseImageInput()) {
                    imageToSend = userImage;
                    log.debug("AI服务 {} 支持图片输入，将发送图片", provider);
                } else if (userImage != null) {
                    log.debug("AI服务 {} 不支持图片输入，仅发送文本", provider);
                }
                
                // 调用具体的AI服务
                String response = callSpecificAiService(config, prompt, imageToSend);
                
                if (response != null && !response.trim().isEmpty()) {
                    log.info("AI服务 {} 调用成功", provider);
                    return response;
                } else {
                    log.warn("AI服务 {} 返回空响应", provider);
                }
                
            } catch (Exception e) {
                log.error("AI服务 {} 调用失败: {}", provider, e.getMessage());
                
                // 如果是最后一个服务，记录详细错误
                if (provider.equals(getLastProvider())) {
                    log.error("所有AI服务都调用失败，最后一个错误详情:", e);
                }
            }
        }
        
        // 所有服务都失败，检查是否启用回退到本地服务
        if (aiServiceProperties.getGlobal().isFallbackToLocal()) {
            return tryLocalFallback(prompt, userImage);
        }
        
        log.error("所有AI服务调用失败，且未启用本地回退");
        return null;
    }
    
    /**
     * 调用具体的AI服务
     * @param config AI服务配置
     * @param prompt 提示词
     * @param userImage 用户图片（可选）
     * @return AI响应
     */
    private String callSpecificAiService(AiProviderConfig config, String prompt, MultipartFile userImage) {
        // 使用统一的HTTP客户端，支持不同的API格式
        return aiHttpClient.sendChatRequest(config, prompt, userImage);
    }
    
    /**
     * 本地服务回退
     * @param prompt 提示词
     * @param userImage 用户图片
     * @return 默认响应
     */
    private String tryLocalFallback(String prompt, MultipartFile userImage) {
        try {
            AiProviderConfig localConfig = aiServiceProperties.getLocal();
            if (localConfig != null && localConfig.isEnabled()) {
                log.info("尝试回退到本地AI服务");
                // 本地服务通常不支持图片，只发送文本
                return callSpecificAiService(localConfig, prompt, null);
            }
        } catch (Exception e) {
            log.error("本地AI服务回退失败", e);
        }
        
        // 最后的默认响应
        log.warn("返回默认AI评分响应");
        return "{\"total_score\": 60, \"character_accuracy\": 60, \"stroke_standard\": 60, \"structure_balance\": 60, \"overall_beauty\": 60, \"detailed_feedback\": \"AI服务暂时不可用，返回默认评分\", \"improvement_suggestions\": \"请稍后重试或检查网络连接\", \"grade_level\": \"及格\"}";
    }
    
    /**
     * 获取最后一个配置的服务提供商
     */
    private String getLastProvider() {
        if (aiServiceProperties.getProviders() != null && !aiServiceProperties.getProviders().isEmpty()) {
            return aiServiceProperties.getProviders().get(aiServiceProperties.getProviders().size() - 1);
        }
        return "unknown";
    }
}
